home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Python 1.3.3 / stdwin / H / lists.h < prev    next >
Text File  |  1995-12-21  |  3KB  |  89 lines

  1. /* Package to manipulate dynamic arrays represented like
  2.    argc/argv (but not necessarily containing character pointers).
  3.    Operations provided are macros that expand to groups of statements;
  4.    their arguments should be side-effect-free.  The arguments argc and
  5.    argv should be single identifiers, since they are assigned to.
  6.    (L_DECLARE expands to a series of declarations.)
  7.    
  8.    This code was written because I found myself writing code very
  9.    similar to it times and times over, or, worse, using fixed-length
  10.    arrays out of laziness.  It's slow for large arrays (although this
  11.    could be improved easily by rounding up the sizes passed to
  12.    malloc/realloc), but this shouldn't be a problem for the applications
  13.    I am currently using it for.  It sure helped me write some array
  14.    processing code faster.
  15.    
  16.    Operations:
  17.    
  18.    L_DECLARE(argc, argv, type)        declare a list with element type 'type'
  19.    L_INIT(argc, argv)            initialize a list
  20.    L_DEALLOC(argc, argv)        deallocate a list
  21.    L_SETSIZE(argc, argv, type, size)    set list to size 'size'
  22.    L_EXTEND(argc, argv, type, count)    append 'count' unitinialized elements
  23.    L_APPEND(argc, argv, type, elem)    append a given element
  24.    L_REMOVE(argc, argv, type, index)    remove element number 'index'
  25.    L_INSERT(argc, argv, type, index, elem)    insert 'elem' at 'index'
  26.    L_SORT(argc, argv, type, compare)    sort the list ('compare' is a function)
  27.    
  28.    (There should also be operations to insert in the middle and to
  29.    remove elements.)
  30.    
  31.    NB: the 'type' argument could be discarded (except for L_DECLARE)
  32.    if we could live with warnings about assignments from malloc/realloc
  33.    to other pointer types.
  34.    
  35. */
  36.  
  37. /* This file only works when included by "stdwtools.h" !!! */
  38.  
  39. /* You could define GOOD_REALLOC if your realloc() calls malloc() when
  40.    passed a NULL pointer */
  41.  
  42. #ifdef GOOD_REALLOC
  43. #define _REALLOC(p, size) realloc(p, size)
  44. #else
  45. #define _REALLOC(p, size) ((p) ? realloc(p, size) : malloc(size))
  46. #endif
  47.  
  48. #define L_DECLARE(argc, argv, type)    int argc = 0; type *argv = 0
  49.  
  50. #define L_INIT(argc, argv)        argc = 0; argv = 0
  51.  
  52. #define L_DEALLOC(argc, argv)        argc = 0; FREE(argv)
  53.  
  54. #define L_SETSIZE(argc, argv, type, size) \
  55.     argv = (type *) _REALLOC((UNIVPTR) argv, \
  56.         (unsigned) (size) * sizeof(type)); \
  57.     argc = (argv == 0) ? 0 : size
  58.  
  59. #define L_EXTEND(argc, argv, type, count) \
  60.     L_SETSIZE(argc, argv, type, argc+count)
  61.  
  62. #define L_APPEND(argc, argv, type, elem) \
  63.     argv = (type *) _REALLOC((UNIVPTR) argv, \
  64.         (unsigned) (argc+1) * sizeof(type)); \
  65.     if (argv == 0) \
  66.         argc = 0; \
  67.     else \
  68.         argv[argc++] = elem
  69.  
  70. #define L_REMOVE(argc, argv, type, index) \
  71.     { \
  72.         int k_; \
  73.         for (k_ = index+1; k_ < argc; ++k_) \
  74.             argv[k_-1] = argv[k_]; \
  75.         L_SETSIZE(argc, argv, type, argc-1); \
  76.     }
  77.  
  78. #define L_INSERT(argc, argv, type, index, item) \
  79.     { \
  80.         int k_; \
  81.         L_SETSIZE(argc, argv, type, argc+1); \
  82.         for (k_ = argc-1; k_ > index; --k_) \
  83.             argv[k_] = argv[k_-1]; \
  84.         argv[index] = item; \
  85.     }
  86.  
  87. #define L_SORT(argc, argv, type, compare) \
  88.     qsort((UNIVPTR)argv, argc, sizeof(type), compare)
  89.